#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
struct cmz
{
	int d;//差值
	int l,r;//左右相邻
	//小根堆
	bool operator<(const cmz&x) const
	{
		if(d!=x.d) return d>x.d;
		else if(l!=x.l) return l>x.l;
		else return r>x.r;
	}
};
const int N=1e6;
int s[N];
bool st[N];//标记当前这个是否出队，堆里可能包含已经出队的堆
//双向链表
int e[N];
int pre[N],ne[N];
priority_queue<cmz> heap;
int main()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		char ch;cin>>ch;
		if(ch=='B') s[i]=1;//1男0女
	}
	for(int i=1;i<=n;i++)
	{
		cin>>e[i];
		pre[i]=i-1;
		ne[i]=i+1;
	}
	pre[1]=ne[n]=0;//代表前面或者后面没元素
	for(int i=2;i<=n;i++)
	{
		if(s[i]!=s[i-1])
		{
			heap.push({abs(e[i]-e[i-1]),i-1,i});
		}
	}
	vector<cmz> v;
	while(heap.size())
	{
		cmz t=heap.top();heap.pop();
		int l=t.l,r=t.r;
		if(st[l]||st[r]) continue;
		v.push_back(t);
		st[l]=st[r]=true;
		//新队列
		ne[pre[l]]=ne[r];
		pre[ne[r]]=pre[l];
		int left=pre[l],right=ne[r];
		// 判断新的左右是否会成为一对
		if(left && right && s[left] != s[right])
        {
            heap.push({abs(e[left] - e[right]), left, right});
        }
	}
        cout<<v.size()<<endl;
        for(auto&x:v)
        {
        	cout<<x.l<<" "<<x.r<<endl;
        }
	return 0;
}